package org.example;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
    public class TransactionService {// 交易服务类
        private final Connection connection;// 数据库连接
        private final AccountService accountService; // 添加AccountService引用

        // 修改构造函数，接收Connection和AccountService
        public TransactionService(Connection connection, AccountService accountService) {
            this.connection = connection;
            this.accountService = accountService;
        }

  /**
     * 记录交易流水
     * @param accountId 账户ID
     * @param type 交易类型（DEPOSIT/WITHDRAW/TRANSFER）
     * @param amount 金额
     * @param targetAccount 目标账户（转账时使用）
     * @param balance_after 当前余额（若<=0会自动查询）
     */
        public void recordTransaction(String accountId, String type, double amount,// 记录交易流水
        String targetAccount, double balance_after) throws SQLException {// 记录交易流水
            // 自动校验余额（通过accountService）
            if (balance_after <= 0) {// 自动校验余额
                balance_after = accountService.getAccountBalance(accountId); // 通过AccountService调用
            }

        String sql = "INSERT INTO yt_transaction (transaction_id, account_id, type, " +
                "amount, time, target_account,balance_after) VALUES (?, ?, ?, ?, ?, ?, ?)";// 插入交易记录

        try (PreparedStatement stmt = connection.prepareStatement(sql)) {// 插入交易记录
            stmt.setString(1, generateTransactionId());// 生成交易ID
            stmt.setString(2, accountId);// 账户ID
            stmt.setString(3, type);// 交易类型
            stmt.setDouble(4, amount);// 金额
            stmt.setTimestamp(5, new Timestamp(System.currentTimeMillis()));// 交易时间
            stmt.setString(6, targetAccount);// 目标账户
            stmt.setDouble(7, balance_after);// 余额
            stmt.executeUpdate();// 执行插入操作
        }
    }
        /**
         * 获取账户交易记录
         * 可考虑添加分页功能，优化大数据量查询性能
         * @param accountId 账户号码
         * @return 交易记录列表
         * @throws SQLException 数据库操作异常
         */
        public List<Transaction> getTransactions(String accountId) throws SQLException {// 获取账户交易记录
            List<Transaction> transactions = new ArrayList<>();
            // 修改 SQL 查询语句，只查询 account_id 等于指定账户 ID 的记录
            String sql = "SELECT * FROM yt_transaction WHERE account_id = ? ORDER BY time DESC";// 查询交易记录
            try (PreparedStatement stmt = connection.prepareStatement(sql)) {// 查询交易记录
                stmt.setString(1, accountId);// 设置账户ID
                try (ResultSet rs = stmt.executeQuery()) {// 查询交易记录
                    while (rs.next()) {
                        Transaction transaction = new Transaction(accountId);
                        transaction.setTransactionId(rs.getString("transaction_id"));
                        transaction.setAccountId(rs.getString("account_id"));
                        transaction.setType(rs.getString("type"));
                        transaction.setAmount(rs.getDouble("amount"));
                        transaction.setTransactionTime(rs.getTimestamp("time"));
                        transaction.setTargetAccount(rs.getString("target_account"));
                        transaction.setBalanceAfter(rs.getDouble("balance_after"));
                        transactions.add(transaction);
                    }
                }
                LoggerUtil.logOperation(accountId,// 记录操作日志
                        String.format("查询到 %d 条交易记录", transactions.size()));// 记录操作日志
                return transactions;// 返回交易记录列表
            } catch (SQLException e) {// 查询交易记录异常
                LoggerUtil.logError("查询交易记录异常", e);// 记录错误日志
                throw e;// 抛出异常
            }
        }

    /**
     * 生成唯一交易ID
     * @return 唯一交易ID
     */
    private String generateTransactionId() {// 生成交易ID
        // 使用UUID生成唯一ID，然后截取前16位作为交易ID
        // UUID生成的ID是全局唯一的，但是长度较长，这里截取前16位比较好
        return UUID.randomUUID().toString().replace("-", "").substring(0, 16);
    }
}